package com.hsu.yupao.common;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 使用双检锁单例模式管理ObjectMapper实例的工具类。
 * ObjectMapper是线程安全的，可以在应用中共享以减少对象创建开销。
 * @ClassName: JsonUtils
 * @author Hsu琛君珩
 * @date 2024-04-06
 * @apiNote
 * @Version: v1.0
 */
public class JsonUtils {
    private static volatile ObjectMapper objectMapper; // 使用volatile关键字保证可见性和有序性

    private JsonUtils() {
        // 私有构造函数防止外部实例化
    }

    /**
     * 获取ObjectMapper单例的方法。
     * @return ObjectMapper单例
     */
    public static ObjectMapper getInstance() {
        if (objectMapper == null) { // 第一次检查
            synchronized (JsonUtils.class) { // 加锁
                if (objectMapper == null) { // 第二次检查
                    objectMapper = new ObjectMapper();
                    // 可以在这里对objectMapper进行配置，例如日期格式等
                    // objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                }
            }
        }
        return objectMapper;
    }

    public static String toJson(Object obj) throws JsonProcessingException {
        return getInstance().writeValueAsString(obj);
    }

    public static <T> T toObject(String json, Class<T> clazz) throws JsonProcessingException {
        return getInstance().readValue(json, clazz);
    }
}
